#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <semaphore.h>
#include <sys/shm.h>
#include <fcntl.h>
#include "libtabla.h"

#ifndef LIBLIST_H_
#define LIBLIST_H_


typedef struct {
   int* _data;
   int _cantMaxElementos;
   int _shmem;
   sem_t* _mutex;
   char* _sem_name;
} Lista;

//Recibe (cantidad de elementos maximos de la lista) Retorna (ok? id memoria compartida : -1)
int crearLista(Lista*, int);

//Recibe (puntero a lista y id de memoria compartida) Retorna (ok? 0 : -1)
int abrirLista(Lista*, int, int);

//Recibe (puntero a lista)
void borrarLista(Lista*);

//Recibe (puntero a lista) Retorna (cantidad de elemetos de la lista)
int cantidadElementos(Lista*);

//Recibe (puntero a lista y elemento a insertar en la lista) Retorna (ok? 0 : -1)
int insertarElemento(Lista*, int);

//Recibe (puntero a lista) Retorna (ok? elemento : -1)
int retirarElemento(Lista*); 

int elementoEnPosicion(Lista*, int);
//Recibe la lista de la cual tomar control
void lockLista(Lista*);

//Recibe la lista a la cual liberar
void unlockLista(Lista*);

//Recibe un puntero a la tabla. la lista a insertar, el pid, el tiempo que insume una instruccion PCU
// y una funcion que retorna el tiempo de servicio
void insertarOrdenado(Tabla * tabla, Lista * lista, int pid, int cpuWait, int (*fn) (Tabla * , int, int));

//Recibe un puntero a la tabla. la lista a insertar, el tiempo que insume una instruccion PCU
// y una funcion que retorna si esta ordenado o no 2 procesos
void ordenarElementos(Tabla * tabla, Lista * lista, int cpuWait, int (*fn) (Tabla * , int, int, int));

#endif /*LIBLIST_H_*/
